package com.niit.mall.cart.controller;


import cn.hutool.core.bean.BeanUtil;
import com.niit.mall.cart.domain.dto.CartFormDTO;
import com.niit.mall.cart.domain.po.Cart;
import com.niit.mall.cart.domain.vo.CartVO;
import com.niit.mall.cart.service.ICartService;
import com.niit.mall.common.api.CommonResult;
import com.niit.mall.common.utils.UserContext;
//import io.seata.spring.annotation.GlobalTransactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 购物车服务
 * @module pardo_mall
 * @BelongsProject: pardo_mall_backend
 * @BelongsPackage: com.niit.mall.cart.controller
 * @Author: ChuXuan
 * @CreateTime: 2025-05-22  00:12
 * @Description: 购物车请求控制器
 * @Version: 1.0
 */
@RestController
@RequestMapping("/cart")
@RequiredArgsConstructor
@Slf4j
public class CartController {
	
	private final ICartService cartService;
	
	/**
	 * 查询我的购物车列表
	 *
	 * @return 我的购物车列表
	 */
	@GetMapping
	public List<CartVO> queryMyCarts(){
		return cartService.queryMyCarts();
	}

	/**
	 * 向购物车添加商品的方法。
	 *
	 * @param cartFormDTO 购物车表单数据传输对象，包含要添加的商品信息
	 * @return CommonResult 返回通用结果对象，包含操作的成功状态
	 */
	@PostMapping
	public CommonResult<Cart> addCartItem(@RequestBody CartFormDTO cartFormDTO) {
		Cart cart = cartService.addCartItem(cartFormDTO);
		return CommonResult.success(cart);
	}
	
	/**
	 * 删除购物车项的方法
	 *
	 * @param id 购物车项的唯一标识
	 * @return 删除操作的结果，成功返回{@link CommonResult}对象，内含操作是否成功的状态
	 */
	@DeleteMapping("/{id}")
	public CommonResult removeCartItem(@PathVariable("id") Long id) {
		cartService.removeById(id);
		return CommonResult.success(true);
	}
	
	/**
	 * 批量删除购物车中的商品项
	 *
	 * @param cartItemIds 要删除的商品项ID列表
	 * @return 通用结果对象，包含操作结果
	 */
	@DeleteMapping
	public CommonResult removeCartItems(@RequestBody List<Long> cartItemIds) {
		log.info("批量删除购物车中的商品项：{}", cartItemIds);
		cartService.removeByItemIds(cartItemIds);
		return CommonResult.success(true);
	}


	/**
	 * 更新购物车信息的方法
	 *
	 * @param cartFormDTO 购物车表单数据传输对象
	 * @return 返回通用结果对象，包含更新成功的状态
	 */
	@PutMapping
	public CommonResult<Cart>  updateCart(@RequestBody CartFormDTO cartFormDTO) {
//		DTO转PO
		Cart cart = BeanUtil.copyProperties(cartFormDTO, Cart.class);
		LocalDateTime now = LocalDateTime.now();
		cart.setUpdateDateTime(now);
		cartService.updateById(cart);
		return CommonResult.success( cart);
	}

	@PutMapping("/reduce")
	public CommonResult<Void> reduceStock(@RequestBody  Map<Long, Integer> productIdToQuantityMap){
		// 根据商品ID和数量更新购物车中商品的库存
		for (Map.Entry<Long, Integer> entry : productIdToQuantityMap.entrySet()) {
			Long productId = entry.getKey();
			Integer quantity = entry.getValue();
			cartService.reduceStock(productId, quantity);
		}
		return CommonResult.success(null);
	}
	
}
